home *** CD-ROM | disk | FTP | other *** search
/ The Programmer Disk / The Programmer Disk (Microforum).iso / xpro / c3 / pro24 / transcri.c < prev    next >
C/C++ Source or Header  |  1986-08-06  |  5KB  |  169 lines

  1. /* transcribe.c -- keyboard to adagio recorder */
  2.  
  3. /*****************************************************************************
  4. *        Change Log
  5. *  Date        | Change
  6. *-----------+-----------------------------------------------------------------
  7. * 23-Feb-86 | Created changelog
  8. *        | Use pedal information when computing durations
  9. *  5-May-86 | Changed data structure for speed
  10. * 21-May-86 | Use record.c to implement record functions
  11. * 26-May-86 | Incorporate cmdline.c
  12. *  6-Aug-86 | Adapted to Lattice V3.00
  13. *****************************************************************************/
  14.  
  15. #include "cext.h"
  16. #include "stdio.h"
  17. #include "cmdline.h"
  18. #include "mpu.h"
  19. #include "userio.h"
  20. #include "record.h"
  21.  
  22. #define STOP_CC 1
  23. #define STOP_CBRK 2
  24. #define STOP_KEY 3
  25. #define STOP_SPACE 4
  26.  
  27. #define num_voices 16
  28.  
  29. #define stop_code ' '
  30. char stop_explanation[] = "Space bar";
  31.  
  32. extern int musictrace;
  33. extern int miditrace;
  34. extern int CBREAK;
  35. extern int debug_intr;
  36. extern int debug_rec;
  37. boolean poll = false;        /* true if poll, false if interrupt */
  38.  
  39. #define nswitches 8
  40. char *switches[nswitches] =
  41.     { "-debug", "-d", "-help", "-miditrace", "-m", "-trace", "-t", "-block" };
  42.  
  43. #define noptions 3
  44. char *options[noptions] = { "-c", "-control", "-tune" };
  45.  
  46. /****************************************************************************
  47. *    Routines local to this module
  48. ****************************************************************************/
  49. private    void    cmdline_help();
  50. private boolean stop_check();
  51.  
  52. /****************************************************************************
  53. *                 cmdline_help
  54. * Effect: 
  55. *    Prints out command line help
  56. ****************************************************************************/
  57.  
  58. private void cmdline_help()
  59. {
  60.     fprintf(stderr,"transcri [options] filename [options]\n");
  61.     fprintf(stderr,"     Options are below.\n");
  62.     fprintf(stderr,"       -block         disable MIDI thru\n");
  63.     fprintf(stderr,"       -control (-c) on  record control info\n");
  64.     fprintf(stderr,"       -control (-c) off do not record control info\n");
  65.     fprintf(stderr,"       -debug (-d)         enable verbose debug mode\n");
  66.     fprintf(stderr,"       -help         this message\n");
  67.     fprintf(stderr,"       -miditrace (-m)   turn on MIDI command trace\n");
  68.     fprintf(stderr,"       -trace (-t)         trace music\n");
  69. }
  70.  
  71. /****************************************************************
  72. *            main
  73. * Effect:
  74. *    transcribe from keyboard
  75. ****************************************************************/
  76.  
  77. void main(argc,argv)
  78.    int argc;
  79.    char *argv[];
  80. {
  81.     long time;            /* current time */
  82.     boolean done = false;    /* set when recording is finished */
  83.     int stop_reason;        /* reason recording is finished */
  84.     char score_na[100];        /* score name */
  85.     int i;            /* used to scan command line */
  86.     char *strptr;        /* string pointer used to get file name */
  87.     int ctrlflag;        /* record control info? */
  88.  
  89.     score_na[0] = NULL;        /* null string */
  90.  
  91.     cl_init(switches, nswitches, options, noptions, argv, argc);
  92.  
  93.     if (cl_switch("-help")) {
  94.     cmdline_help(); 
  95.     return;
  96.     }
  97.  
  98.     if ((strptr = cl_arg(1)) != NULL)
  99.     strcpy(score_na, strptr);
  100.  
  101.     if ((strptr = cl_noption(options, noptions)) != NULL) {
  102.     ctrlflag = (strcmp(strptr, "on") == 0);
  103.     } else {
  104.     ctrlflag = askbool("Pitch bend, etc. on", false);
  105.     }
  106.     musicinit();
  107.  
  108.     /* reset all channels to MIDI program 1: */
  109.     for (i = 0; i < num_voices; i++) {
  110.     midi_program(i, 1);
  111.     }
  112.  
  113.     if (!rec_init(score_na, ctrlflag)) {
  114.     printf("No space for recording, use a smaller adagio file.\n");
  115.     musicterm();
  116.     exit(1);
  117.     }
  118.  
  119.     printf("Transcribe ready.  Type space bar to stop.\n");
  120.  
  121.     timereset();
  122.     while (!done) {
  123.     time = gettime()/* delay everything by offset */;
  124.     if (rec_poll(time)) {    /* record anything that's there */
  125.         done = true;
  126.         stop_reason = STOP_SPACE;
  127.     }
  128.     if (CBREAK || kbhit()) {
  129.         done |= stop_check(&stop_reason);
  130.     }
  131.     mpu_error_check();    /* look for buffer overflow */
  132.     }
  133.     rec_final(false);    /* write out recorded data, */
  134.             /* suppress time of first event*/
  135.     musicterm();
  136. }
  137.  
  138. /****************************************************************************
  139. *                     stop_check
  140. * Outputs:
  141. *    *reason is set to reason for stop
  142. *    true is returned iff play should stop
  143. * Effect: 
  144. *    Checks for break character or stop code from kbd
  145. ****************************************************************************/
  146.  
  147. private boolean stop_check(reason)
  148.     int *reason;
  149. {
  150.     boolean done = false;
  151.     switch(CBREAK) { /* stop reason */
  152.     case 0: /* no stop code, try keyboard */
  153.         done = (getch() == stop_code);
  154.         if (done) *reason = STOP_KEY;
  155.         break;
  156.     case 1: /* ctrl-break */
  157.         done = true;
  158.         if (kbhit()) getch();
  159.         *reason = STOP_CBRK;
  160.         break;
  161.     case 2: /* ctrl-C */
  162.         done = true;
  163.         *reason = STOP_CC;
  164.         if (kbhit()) getch();
  165.         break;
  166.     } /* stop reason */
  167.     return done;
  168. }
  169.